package cn.iocoder.yudao.module.worker.dal.mysql.trend;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.worker.controller.app.trend.vo.AppWorkerTrendPageReqVO;
import cn.iocoder.yudao.module.worker.dal.dataobject.trend.WorkerTrendDO;
import cn.iocoder.yudao.module.worker.enums.TrendQueryTypeEnum;
import cn.iocoder.yudao.module.worker.enums.trend.TrendTypeEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.worker.controller.admin.trend.vo.*;

/**
 * 店员动态 Mapper
 *
 * @author Jerry
 */
@Mapper
public interface WorkerTrendMapper extends BaseMapperX<WorkerTrendDO> {

    default PageResult<WorkerTrendDO> selectPage(WorkerTrendPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<WorkerTrendDO>()
                .eqIfPresent(WorkerTrendDO::getWorkerClerkId, reqVO.getWorkerClerkId())
                .likeIfPresent(WorkerTrendDO::getCity, reqVO.getCity())
                .eqIfPresent(WorkerTrendDO::getUserId, reqVO.getUserId())
                .likeIfPresent(WorkerTrendDO::getContent, reqVO.getContent())
                .eqIfPresent(WorkerTrendDO::getFile, reqVO.getFile())
                .eqIfPresent(WorkerTrendDO::getFileType, reqVO.getFileType())
                .eqIfPresent(WorkerTrendDO::getWeight, reqVO.getWeight())
                .eqIfPresent(WorkerTrendDO::getSeconds, reqVO.getSeconds())
                .eqIfPresent(WorkerTrendDO::getLikeNum, reqVO.getLike())
                .eqIfPresent(WorkerTrendDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(WorkerTrendDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(WorkerTrendDO::getId));
    }

    default PageResult<WorkerTrendDO> selectPage(AppWorkerTrendPageReqVO reqVO) {
       if(TrendQueryTypeEnum.NEW.getQueryType().equals(reqVO.getQueryType())){
            return selectPage(reqVO, new LambdaQueryWrapperX<WorkerTrendDO>()
                    .eqIfPresent(WorkerTrendDO::getWorkerClerkId, reqVO.getWorkerClerkId())
                    .eqIfPresent(WorkerTrendDO::getUserId, reqVO.getWorkerUserId())
                    .eqIfPresent(WorkerTrendDO::getCity, reqVO.getCity())
                    .eqIfPresent(WorkerTrendDO::getTrendType, reqVO.getTrendType())
                    .eqIfPresent(WorkerTrendDO::getContent, reqVO.getContent())
                    .eqIfPresent(WorkerTrendDO::getFile, reqVO.getFile())
                    .eqIfPresent(WorkerTrendDO::getFileType, reqVO.getFileType())
                    .eqIfPresent(WorkerTrendDO::getWeight, reqVO.getWeight())
                    .eqIfPresent(WorkerTrendDO::getSeconds, reqVO.getSeconds())
                    .eqIfPresent(WorkerTrendDO::getLikeNum, reqVO.getLike())
                    .eqIfPresent(WorkerTrendDO::getStatus, true)
                    .or().eq(WorkerTrendDO::getUserId, reqVO.getUserId())
                    .orderByDesc(WorkerTrendDO::getWeight, WorkerTrendDO::getCreateTime, WorkerTrendDO::getLikeNum));
        }else if(TrendQueryTypeEnum.FANS.getQueryType().equals(reqVO.getQueryType()) && reqVO.getUserId() != null){
           return selectPage(reqVO, new LambdaQueryWrapperX<WorkerTrendDO>()
                   .eqIfPresent(WorkerTrendDO::getWorkerClerkId, reqVO.getWorkerClerkId())
                   .eqIfPresent(WorkerTrendDO::getUserId, reqVO.getWorkerUserId())
                   .eqIfPresent(WorkerTrendDO::getCity, reqVO.getCity())
                   .eqIfPresent(WorkerTrendDO::getTrendType, TrendTypeEnum.CLERK.getType())
                   .eqIfPresent(WorkerTrendDO::getContent, reqVO.getContent())
                   .eqIfPresent(WorkerTrendDO::getFile, reqVO.getFile())
                   .eqIfPresent(WorkerTrendDO::getFileType, reqVO.getFileType())
                   .eqIfPresent(WorkerTrendDO::getWeight, reqVO.getWeight())
                   .eqIfPresent(WorkerTrendDO::getSeconds, reqVO.getSeconds())
                   .eqIfPresent(WorkerTrendDO::getLikeNum, reqVO.getLike())
                   .eqIfPresent(WorkerTrendDO::getStatus, true)
                   .or().eq(WorkerTrendDO::getUserId, reqVO.getUserId())
                   .orderByDesc(WorkerTrendDO::getWeight, WorkerTrendDO::getCreateTime, WorkerTrendDO::getLikeNum));
        }

        return selectPage(reqVO, new LambdaQueryWrapperX<WorkerTrendDO>()
                .eqIfPresent(WorkerTrendDO::getWorkerClerkId, reqVO.getWorkerClerkId())
                .eqIfPresent(WorkerTrendDO::getCity, reqVO.getCity())
                .eqIfPresent(WorkerTrendDO::getTrendType, reqVO.getTrendType())
                .eqIfPresent(WorkerTrendDO::getContent, reqVO.getContent())
                .eqIfPresent(WorkerTrendDO::getFile, reqVO.getFile())
                .eqIfPresent(WorkerTrendDO::getFileType, reqVO.getFileType())
                .eqIfPresent(WorkerTrendDO::getWeight, reqVO.getWeight())
                .eqIfPresent(WorkerTrendDO::getSeconds, reqVO.getSeconds())
                .eqIfPresent(WorkerTrendDO::getLikeNum, reqVO.getLike())
                .eqIfPresent(WorkerTrendDO::getStatus, true)
                .or().eq(WorkerTrendDO::getUserId, reqVO.getUserId())
                .orderByDesc(WorkerTrendDO::getWeight,WorkerTrendDO::getLikeNum)
                .orderByAsc(WorkerTrendDO::getCreateTime));

    }

    default void updateLikeCount(Long id, Integer likeCount){
        update(new LambdaUpdateWrapper<WorkerTrendDO>()
                .set(WorkerTrendDO::getLikeNum, likeCount)
                .eq(WorkerTrendDO::getId, id));
    };

    default Integer getTrendNum(Long workerClerkId){
        return selectJoinOne(Integer.class, new MPJLambdaWrapperX<WorkerTrendDO>()
                .selectCount(WorkerTrendDO::getId)
                .eq(WorkerTrendDO::getStatus, true)
                .eq(WorkerTrendDO::getWorkerClerkId, workerClerkId));
    }

    default PageResult<WorkerTrendDO> getMyTrendPage(AppWorkerTrendPageReqVO reqVO){
        if(TrendQueryTypeEnum.NEW.getQueryType().equals(reqVO.getQueryType())){
            return selectPage(reqVO, new LambdaQueryWrapperX<WorkerTrendDO>()
                    .eqIfPresent(WorkerTrendDO::getUserId, reqVO.getUserId())
                    .orderByDesc(WorkerTrendDO::getCreateTime));
        }

        return selectPage(reqVO, new LambdaQueryWrapperX<WorkerTrendDO>()
                .eqIfPresent(WorkerTrendDO::getUserId, reqVO.getUserId())
                .orderByDesc(WorkerTrendDO::getLikeNum));
    }
}